/* eslint-disable @typescript-eslint/no-var-requires */
import Koa from 'koa';
import bodyParse from 'koa-bodyparser';
import apiMiddleare from './middleware/api-middleware';
import router from './router/index';
import logger from 'koa-logger';
import moment from 'moment';
import cors from 'koa2-cors';
import koajwt from 'koa-jwt';
import * as jwt from './util/token';
import { PORT, IP } from './config/index';
import { unlessPath } from './const';
const tokenMiddlware = require('./middleware/token-middleware');
const onerror = require('koa-onerror');
const koaBody = require('koa-body')

const port = Number(process.env.PORT) || PORT;
const ip = process.env.IP || IP;

const app = new Koa();

// 跨域处理
app.use(cors({
  origin:"*", // 允许来自指定域名请求,
  maxAge: 5, // 本次预检请求的有效期，单位为秒。
  credentials: true // 是否允许发送Cookie
}));
// app.use(cors({
//   origin: function() {
//     // if (ctx.url === '/test') {
//       return "*"; // 暂时允许来自所有域名请求
//     // }
//   },
//   maxAge: 5,
//   credentials: true,
//   allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
//   allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
// }))

// error handler
onerror(app);

const loggerWithTime = logger(str => {
  console.log(moment().format('YYYY-MM-DD HH:mm:ss') + str);
})

// 日志打印，按理来说这里应该上传到日志平台
app.use(loggerWithTime);

// 对token进行验证
app.use(async (ctx, next) => {
  return next().catch((err) => {
      if (err.status === 401) {
          ctx.status = 401;
          ctx.body = {
              ...ctx.body,
              code: 401,
              msg: err.message
          }
      } else {
          throw err;
      }
  })
});

// 需要token检测的接口
app.use(koajwt({
  secret: jwt.secret,
  debug: true,
  passthrough: true,
}).unless({
  // 登录，注册接口不需要验证
  path: unlessPath
}));

// token校验和自动刷新
app.use(tokenMiddlware().unless({
  path: unlessPath
}));

// 支持不同的类型
app.use(koaBody({
  multipart: true, // 允许上传多个文件
  formidable: {
      maxFieldsSize: 200 * 1024 * 1024, //上传文件大小
      keepExtensions: true, //  保存图片的扩展名
  }
}))

//body解析
app.use(bodyParse());

// 注入自定义返回中间件
app.use(apiMiddleare());

// 路由相关
app.use(router.routes());
app.use(router.allowedMethods());

// error-handling,监听产生的error
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});

app.listen(port, ip);

console.log(`server is listening ${port} ....`)
